// ======================= oss-util上传 公共方法 ===========================
// 依赖库：jquery   
// 本代码更新于：2019-5-1 新增更简单的写法 

// ======================= 以下是新方法 ===========================


// 将方法挂载到sa对象上
window.sa = window.sa || {};

// 上传图片   
sa.uploadImage = function(successCB) {
	sa.uploadFile(1, successCB);
}
// 上传视频   
sa.uploadVideo = function(successCB) {
	sa.uploadFile(2, successCB);
}
// 上传音频  
sa.uploadAudio = function(successCB) {
	sa.uploadFile(3, successCB);
}
// 上传pdf
sa.uploadAudio = function(successCB) {
	sa.uploadFile(11, successCB);
}
// 上传apk 
sa.uploadApk = function(successCB) {
	sa.uploadFile(12, successCB);
}
// 上传文件  (要上传到的地址，成功的回调)
sa.uploadFile = function(way, successCB) {
	// 创建input 
	var fileInput = document.createElement("input"); //创建input
	fileInput.type = "file"; //设置类型为file
	fileInput.id = 'uploadfile-' + sa.randomString(12);
	fileInput.style.display = 'none';
	fileInput.onchange = function(evt) {
		// startUpload(evt.target.files[0], url, successCB);
		startUpload({
			file: evt.target.files[0],
			successCB: successCB,
			way: way
		});
	}
	// 添加到body，并触发其点击事件 
	document.body.appendChild(fileInput);
	document.querySelector('#' + fileInput.id).click();
}
// 上传多张图片   
sa.uploadImageList = function(successCB) {
	// 创建input
	var fileInput = document.createElement("input"); //创建input
	fileInput.type = "file"; // 设置类型为file
	fileInput.multiple = "multiple"; // 多选 
	fileInput.id = 'uploadfile-' + sa.randomString(12);
	fileInput.style.display = 'none';
	fileInput.onchange = function(evt) {
		// 开始上传 
		var files = evt.target.files;
		for (var i = 0; i < files.length; i++) {
			let ii = i;
			startUploadImage2(files[i], function(src) {
				successCB(src);
			}.bind(this));
		}
	}
	// 添加到body，并触发其点击事件 
	document.body.appendChild(fileInput);
	document.querySelector('#' + fileInput.id).click();
	
	
}




// ======================= 以下是旧方法 ===========================

// 开始上传，图片版
function startUploadImage(file, successCB) {
	startUpload({
		file: file,
		successCB: successCB,
		way: 1
	});
}
// 开始上传，图片版第2个 ，屏蔽loading，加个进度条函数 
function startUploadImage2(file, successCB, progressCB) {
	startUpload({
		file: file,
		successCB: successCB,
		progressCB: progressCB,
		// ajax_msg: null
	});
}

// 开始上传，视频版
function startUploadVideo(file, successCB) {
	startUpload({
		file: file,
		successCB: successCB,
		way: 2
	});
}
// 开始上传，音频版
function startUploadAudio(file, successCB) {
	startUpload({
		file: file,
		successCB: successCB,
		way: 3
	});
}
// 开始上传，pdf版
function startUploadPdf(file, successCB) {
	startUpload({
		file: file,
		successCB: successCB,
		way: 11
	});
}
// 开始上传，apk版
function startUploadApk(file, successCB) {
	startUpload({
		file: file,
		successCB: successCB,
		way: 12
	});
}



// 开始上传 最全版
// file=文件，way=方式（1=图片，2=视频，11=pdf）
// successCB=成功回调，progressCB=进度回调 ，ajax_msg = ajax的load文字 
// 是否显示滚动条 
// function startUpload(file, successCB, errorCB, progressCB, way, ajax_msg) {
function startUpload(param) {
	// 方式
	param.way = param.way || 1;
	// 错误回调 
	if (!param.errorCB) {
		param.errorCB = function(errorMsg) {
			alert(JSON.stringify(errorMsg));
		}
	}
	// 进度回调 
	if (!param.progressCB) {
		param.progressCB = function(num) {
			// console.log(num);
		}
	}
	if(param.ajax_msg === undefined) {
		param.ajax_msg = '正在获取文件信息...';
	}
	if(param.is_jdt === undefined) {
		param.is_jdt = true;
	}
	getSignInfo(param);
	// var param = {
	// 	file: file, 
	// 	successCB: successCB, 
	// 	errorCB: errorCB,  
	// 	progressCB: progressCB, 
	// 	way: way, 
	// 	ajax_msg: ajax_msg 
	// }
}




// ======================= 私有方法 =========================== 

// 获取签名的地址 
var get_sign_url = '/alioss/getSign?a=1';
	
// 获取签名信息并调用 upload_oss
// function getSignInfo(file, successCB, progressCB, way, ajax_msg) {
function getSignInfo(param) {

	var ext = get_suffix(param.file.name);
	var url = get_sign_url + '&ext=' + ext + '&way=' + param.way;

	sa.ajax(url, {}, function(res) {
		var sign_obj = res.data;

		// 1、验证大小 
		if (param.file.size > sign_obj.max_size) {
			param.errorCB('文件太大');
			return false;
		}

		// 2、验证文件类型 
		if (sign_obj.ext_list.split(",").indexOf(ext) == -1) {
			param.errorCB('不支持的文件类型：' + ext);
			return false;
		}

		param.sign_obj = sign_obj; // 添加上签名信息 
		upload_oss(param);

	}, {
		msg: param.ajax_msg
	});
}


// 上传到阿里云
// file对象, 签名对象， 成功回调,失败回调 
function upload_oss(option) {

	// 获取参数 
	var file = option.file; // 文件对象 
	var sign_obj = option.sign_obj; // 签名信息 
	var successCB = option.successCB; // 成功回调 
	var progressCB = option.progressCB; // 进度回调 
	var errorCB = option.errorCB; // 失败回调 
	var beforeSend = option.beforeSend;	// 之前的回调 
	var is_jdt = option.is_jdt;	// 是否显示进度条 

	// 2、声明FormData对象
	var request = new FormData();
	request.append("OSSAccessKeyId", sign_obj.OSSAccessKeyId); //Bucket 拥有者的Access Key Id。
	request.append("policy", sign_obj.policy); //policy规定了请求的表单域的合法性
	request.append("Signature", sign_obj.Signature); //根据Access Key Secret和policy计算的签名信息，OSS验证该签名信息从而验证该Post请求的合法性
	request.append("key", sign_obj.key); //文件名字，可设置路径
	request.append("success_action_status", sign_obj.success_action_status); // 让服务端返回200,不然，默认会返回204
	request.append('x-oss-object-acl', sign_obj['x-oss-object-acl']);
	request.append('file', file);


	// 3、开始上传
	$.ajax({
		url: sign_obj.host, // 上传阿里地址
		data: request,
		processData: false, // 默认true，设置为 false，不需要进行序列化处理
		cache: false, // 设置为false将不会从浏览器缓存中加载请求信息
		//async: false, // 发送同步请求
		contentType: false, // 避免服务器不能正常解析文件---------具体的可以查下这些参数的含义
		dataType: 'xml', // 不涉及跨域  写json即可
		type: 'post',
		beforeSend: function (xhr) {
			if(is_jdt) {
				show_jdt();
			}
        },
		complete: function (xhr) {
			if(is_jdt) {
				close_jdt();
			}
        },
		success: function(callbackHost, request) { // callbackHost：success,request中就是 回调的一些信息，包括状态码什么的
			// successCB(callbackHost, request);
			var file_url = sign_obj.file_url;
			if(localStorage.getItem('oss_sy') === 'true') {
				file_url = sign_obj.file_url_handle;
			}
			if(localStorage.getItem('oss_sy') === 'false') {
				file_url = sign_obj.file_url_not_handle;
			}
			successCB(file_url, sign_obj.file_url_handle, sign_obj.file_url_not_handle); // 默认版、带处理参数版, 不带处理参数版 
		},
		error: function(returndata) {
			errorCB(returndata);
		},
		xhr: xhrOnProgress(function(e) {
			var percent = e.loaded / e.total; // 计算进度百分比, 取值结果为 0~1 之间的小无限不循环小数 
			progressCB(percent * 100);
			if(is_jdt) {
				set_jdt_value(percent * 100);
			}
			// console.log('进度百分比' + percent);
		})
	});


}


// 返回后缀名
function get_suffix(filename) {
	var pos = filename.lastIndexOf('.');
	if (pos != -1) {
		suffix = filename.substring(pos + 1);
	}
	return suffix;
}

// 返回带有上传回调功能的 xhr 
function xhrOnProgress(fun) {
	xhrOnProgress.onprogress = fun; //绑定监听
	//使用闭包实现监听绑
	return function() {
		//通过$.ajaxSettings.xhr();获得XMLHttpRequest对象
		var xhr = $.ajaxSettings.xhr();
		//判断监听函数是否为函数
		if (typeof xhrOnProgress.onprogress !== 'function')
			return xhr;
		//如果有监听函数并且xhr对象支持绑定时就把监听函数绑定上去
		if (xhrOnProgress.onprogress && xhr.upload) {
			xhr.upload.onprogress = xhrOnProgress.onprogress;
		}
		return xhr;
	}
}



// ======================= 进度条相关 ===========================
// 显示进度条 
function show_jdt() {
	close_jdt();	// 先清除原来的 
	// 创建节点并添加到body 
	var str = '' +
		'<div class="jdt-fox" style="z-index: 999999999; width: 500px; height: 20px; position: fixed; top: calc(50% - 5px); left: calc(50% - 250px); ">'+
		'	<div class="jdt-fox2" style="width: calc(100% - 100px); height: 6px; margin-top: 7px; border-radius: 3px; float: left; background-color: #FFF; box-shadow: 0 0 10px #aaa;">'+
		'		<div class="jdt-fox-value" style=" transition: all 0.1s; position: relative; width: 0.0%; height: 100%; border-radius: 3px; background-color: green; box-shadow: 0 0 10px green;">'+
		'			<div class="jdt-fox-yh" style="position: absolute; right: -10px; top: -5px;">'+
		'				<div style="transition: all 1s; background-color: green; width: 16px; height: 16px; border-radius: 50%;"></div>'+
		'			</div>'+
		'		</div>'+
		'	</div>'+
		'	<div class="jdt-value-text" style="float: left; font-size: 14px; margin-left: 14px; color: #111;"> 0.0% </div>'+
		'</div>';
	var div = document.createElement("div");
	div.innerHTML = str;
	div.className = "jdt-box";
	document.body.appendChild(div);
	// 开启圆点的呼吸动画效果
	if (window.my_interval_index) {
		clearInterval(window.my_interval_index);
	}
	window.my_interval_index = setInterval(function() {
		if (window.one_num === undefined) {
			window.one_num = 0;
		}
		window.one_num++;
		var n_px = window.one_num % 2 == 0 ? '0px' : '20px';
		var box_shadow = "0 0 " + n_px + " green";
		document.querySelector('.jdt-fox-yh div').style.boxShadow = box_shadow;
	}, 1000);
}

// 关闭进度条 
function close_jdt() {
	// 先关闭动画 
	if (window.my_interval_index) {
		clearInterval(window.my_interval_index);
	}
	// 再销毁dom 
	var box = document.querySelector('.jdt-box');
	if (box) {
		box.parentNode.removeChild(box);
	}
}

// 设置进度条进度, 参数为一个0~100之间的小数 
function set_jdt_value(value) {
	value = parseInt(value * 10) / 10.0 + '%';	// 保证小数点后一位 
	document.querySelector('.jdt-fox-value').style.width = value;	// 改变进度条宽度
	document.querySelector('.jdt-value-text').innerHTML = value;	// 改变文字百分比值  
	// console.log(value);
}










